from __future__ import annotations

from typing import Iterable

from flask_jwt_extended import get_jwt
from flask_restx import Namespace


# /**
#  * 作者: "test_LH"
#  * 日期: 2025-10-11
#  * 名称: require_roles
#  * 作用: 校验当前 JWT 是否具备指定角色列表中的任意一个
#  * 参数:
#  *   @param namespace 当前操作的命名空间，用于抛出 API 错误
#  *   @param required_roles 允许访问的角色集合
#  * 返回: 无
#  * 备注: 验证失败时直接抛出 403
#  */
def require_roles(namespace: Namespace, required_roles: Iterable[str]) -> None:
    claims = get_jwt() or {}
    roles = set(claims.get("roles", []))
    if not roles.intersection(required_roles):
        readable = ", ".join(required_roles)
        namespace.abort(403, f"需要以下角色之一：{readable}")


# /**
#  * 作者: "test_LH"
#  * 日期: 2025-10-11
#  * 名称: require_role
#  * 作用: 校验当前 JWT 是否包含指定单个角色
#  * 参数:
#  *   @param namespace 当前操作的命名空间
#  *   @param required_role 要求具备的角色名称
#  * 返回: 无
#  * 备注: 内部复用 require_roles
#  */
def require_role(namespace: Namespace, required_role: str) -> None:
    require_roles(namespace, [required_role])
